#include "task_powerbuffer.h"

extern ChassisPowerDataStruct Power;
extern judgement_protection_struct judgement_protection;

static int spinCnt=0;
float randomSpin=0;
extern int PowerUpFlag;
extern float NowpowerLimit;
void powerbuffertask(void *argument)
{
    for(;;)
    {
        //当裁判系统数据丢失时，自己计算缓冲能量，未丢失时使用裁判系统发送回来的缓冲能量数据
        if(judgement_protection.judgement_lost_flag == 1)
        {
            Power.Buffer -= (judge_rece_mesg.power_heat_data.chassis_power - (float)judgement_protection.chassis_power_limit) * 0.1f;
            if(Power.Buffer < 0)
            {
                Power.Buffer = 0;
            }
            if(Power.Buffer > 60.0f) Power.Buffer = 60.0f;
        }

        //每0.2秒生成一个随机转速
        if(spinCnt==2)
        {
            uint32_t temp=0;
            spinCnt=0;
            HAL_RNG_GenerateRandomNumber(&hrng,&temp);
#if infantryID == 0
            if(NowpowerLimit<=55)
            {
                randomSpin = (float)(temp % 200) / 5000 + 0.32f;//0.25f
            }
            else if(NowpowerLimit<80)
            {
                randomSpin = (float)(temp % 200) / 3000 + 0.32f;
            }
            else
            {
                randomSpin = (float)(temp % 200) / 2000 + 0.32f;
            }
#elif infantryID == 1
            if(NowpowerLimit<=55)
            {
                randomSpin = (float)(temp % 200) / 5000 + 0.32f;
            }
            else if(NowpowerLimit<80)
            {
                randomSpin = (float)(temp % 200) / 3000 + 0.32f;
            }
            else {
                randomSpin = (float) (temp % 200) / 2000 + 0.32f;
            }
#endif
        }
        else
        {
            spinCnt++;
        }

        //上电自检部分
        /*
         * 小陀螺情况下复活上电时，四个电机上电时间不一致，可能导致一个电机开始转，剩余三个电机还没上电，
         * 而被带着转产生感生电动势，电调检测到三相电异常而无法正常工作，小陀螺会表现出一个轮子转而其余轮子不转
         * 考虑采用该方案：上电接受到一个电机数据后先不允许发送数据给电机，
         * 延迟2s后才发送电机给数据（保证各个电机均上电成功）
         */
        if(PowerUpFlag>0 && PowerUpFlag<20)
        {
            PowerUpFlag++;
        }
        else
        {
            PowerUpFlag=20;
        }

        osDelay(100);
    }
}
